package paint2.ui.factorias;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import paint2.modelo.Circulo;
import paint2.modelo.Linea;
import paint2.modelo.Punto;
import paint2.modelo.Rectangulo;
import paint2.ui.Elemento;
import paint2.ui.ElementoVisible;
import paint2.ui.ventanas.Ventana;
import paint2.ui.ventanas.VentanaPrincipal;

public class FactoriaDeElementosDeTrazado implements Factoria{

    private VentanaPrincipal ventana;

    public List<ElementoVisible> obtener(Ventana ventana) {

        this.ventana = (VentanaPrincipal) ventana;
        
        List<ElementoVisible> elementos = new ArrayList();

        Elemento linea = new Elemento("Linea", "linea");
        linea.agregarActionListener(new AgregarListenerDeLineaASuperficePintable());
        elementos.add(linea);

        Elemento rectangulo = new Elemento("Rectangulo", "cuadrado");
        rectangulo.agregarActionListener(new AgregarListenerDeRectanguloASuperficiePintable());
        elementos.add(rectangulo);

        Elemento circulo = new Elemento("Circulo", "circulo");
        circulo.agregarActionListener(new AgregarListenerDeCirculoASuperficePintable());
        elementos.add(circulo);

        Elemento limpiarLienzo = new Elemento("Limpiar lienzo","bomb");
        limpiarLienzo.agregarActionListener(new ListenerLimpiarLienzo());
        elementos.add(limpiarLienzo);

        return elementos;
    }

    class AgregarListenerDeLineaASuperficePintable implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            ventana.obtenerSuperficiePintable().agregarListener(new AgregarLinea());
            ventana.cambiarElEstadoA("linea");
        }

    }

    class AgregarLinea implements MouseListener {

        private Punto inicio;
        private Punto fin;
        private Linea linea;

        public void mouseClicked(MouseEvent me) {
        }

        public void mousePressed(MouseEvent me) {
            this.linea = new Linea();
            this.inicio = new Punto((float) me.getX(), (float) me.getY());
            this.linea.setInicio(inicio);
        }

        public void mouseReleased(MouseEvent me) {
            this.fin = new Punto((float) me.getX(), (float) me.getY());
            this.linea.setFin(this.fin);
            ventana.obtenerSuperficiePintable().pintarUna(linea);
        }

        public void mouseEntered(MouseEvent me) {
        }

        public void mouseExited(MouseEvent me) {
        }

    }

    class AgregarListenerDeRectanguloASuperficiePintable implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            ventana.obtenerSuperficiePintable().agregarListener(new AgregarRectangulo());
            ventana.cambiarElEstadoA("rectangulo");
        }

    }

    class AgregarRectangulo implements MouseListener {

        private Punto inicio;
        private Punto fin;
        private Rectangulo rectangulo;

        public void mouseClicked(MouseEvent me) {

        }

        public void mousePressed(MouseEvent me) {
            this.rectangulo = new Rectangulo();
            this.inicio = new Punto((float) me.getX(), (float) me.getY());
            this.rectangulo.setInicio(inicio);
        }

        public void mouseReleased(MouseEvent me) {
            this.fin = new Punto((float) me.getX() - inicio.x(), (float) me.getY() - inicio.y());
            this.rectangulo.setFin(this.fin);
            ventana.obtenerSuperficiePintable().pintarUna(rectangulo);
        }

        public void mouseEntered(MouseEvent me) {

        }

        public void mouseExited(MouseEvent me) {

        }

    }

    class AgregarListenerDeCirculoASuperficePintable implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            ventana.obtenerSuperficiePintable().agregarListener(new AgregarCirculo());
            ventana.cambiarElEstadoA("circulo");
        }

    }

    class AgregarCirculo implements MouseListener {

        private Punto inicio;
        private Punto fin;
        private Circulo circulo;

        public void mouseClicked(MouseEvent me) {
        }

        public void mousePressed(MouseEvent me) {
            this.circulo = new Circulo();
            this.inicio = new Punto((float) me.getX(), (float) me.getY());
            this.circulo.setInicio(inicio);
        }

        public void mouseReleased(MouseEvent me) {
            this.fin = new Punto((float) me.getX(), (float) me.getY());
            this.circulo.setFin(this.fin);
            ventana.obtenerSuperficiePintable().pintarUna(circulo);
        }

        public void mouseEntered(MouseEvent me) {
        }

        public void mouseExited(MouseEvent me) {
        }

    }

    class ListenerLimpiarLienzo implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            ventana.obtenerSuperficiePintable().borrarTodasLasFiguras();
        }

    }

}
